import java.io.IOException;

public class Pere extends Thread
 {
  private Process        process;
  private Tampon         tamponDEmission;
  private Tampon tamponDeTrace;
  private Tampon tamponDeReception;
  private HorlogeLamport horloge;
  private boolean test=true;
   
  public Pere (Process _process)
   {
    this.process = _process;
    this.tamponDEmission = this.process.getTamponDEmission();
    this.tamponDeTrace = this.process.getTamponDeTrace();
    this.tamponDeReception = this.process.getTamponDeReception();
    this.horloge = this.process.getHorloge();
   }
    
  @Override
  public void run()
   {
    MessageUtile message = null;
    boolean test = true;

    while (test)
    {
      System.out.println (process.getNumProcess() + " : Pere      : Attente d'un message ---------------------------> " + horloge.getCompteur());
      message = receptionMessage();
           
      if(message.getContenu().equals("Fin"))
      {
    	    System.out.println("Fermeture du thread p�re du processus " + process.getNumProcess());
	    MessageUtile messageFin = new MessageUtile ("Fin",0,0);
            envoiMessage(messageFin);
    	    test=false;
      }
      else
      {
    	  int numAleatoire;
      	  numAleatoire = (int) (Math.random() * 30);
        
      		if (numAleatoire >= 1 && numAleatoire < 28)
            {                         
      		horloge.incrementeHorloge();	
                MessageUtile messageTest = new MessageUtile ("REP",this.horloge.getCompteur(),process.getNumProcess());
      			envoiMessage (messageTest);
            }
      		else 
      		{
      			System.out.println (process.getNumProcess() + " : Pere      : Fermeture du SVG -------------------------------> " + horloge.getCompteur());
      			MessageUtile messageFin = new MessageUtile ("Fin",0,0);
      			envoiMessage(messageFin);
      		}
      }
     }
   }
   
  public void envoiMessage (Message message)
   {
    tamponDEmission.setElementTampon (message);
    //horloge.incrementeHorloge(); 
    System.out.println (process.getNumProcess() + " : Pere      : Envoi d'un message -----------------------------> " + horloge.getCompteur());
   }
   
  public MessageUtile receptionMessage ()
   {
    MessageUtile message = (MessageUtile) tamponDeReception.getElementTampon();
    horloge.incrementeHorloge(message.getEstampille());
    envoiTrace (message);
    System.out.println (process.getNumProcess() + " : Pere      : Reception d'un message -------------------------> " + horloge.getCompteur());
    return message;
   }
   
  public void envoiTrace (MessageUtile message)
   {
    System.out.println (process.getNumProcess() + " : Pere      : Tracer --> " + message);
    Message ordre = new MessageOrdre (message.getContenu(), message.getIdProcess(), this.process.getNumProcess(), message.getEstampille(), this.horloge.getCompteur());      
    tamponDeTrace.setElementTampon (ordre);
    System.out.println (process.getNumProcess() + " : Pere      : Envoi de --> " + ordre);
   }       
 }       
  

